package cn.syncrond.tcm.core.pool;

import java.util.List;
import java.util.concurrent.Future;
import java.util.concurrent.RunnableFuture;

import cn.syncrond.tcm.AppContext;
import cn.syncrond.tcm.core.definition.ITask;
import cn.syncrond.tcm.core.definition.ITaskPool;
import cn.syncrond.tcm.core.definition.ITaskResult;
import cn.syncrond.tcm.core.ext.ITaskPoolEventListener;
import cn.syncrond.tcm.core.ext.IVisitor;

/**
 * @Description: 任务池
 * 	门面类，屏蔽Executor原有的提交方式，提供新的基于任务的提交方法，以及获取监控信息
 * @author meepai
 * @date 2016-11-21
 */
public class TaskPool implements ITaskPool {
	
	/**
	 * 任务线程池执行器
	 */
	private final TaskThreadPoolExecutor executor;
	
	public TaskPool(){
		// 获取初始化的线程池大小
		int poolSize = AppContext.getInstance().getInitThreadPoolSize();
		// 创建Executor对象
		executor = new TaskThreadPoolExecutor(poolSize);
		// 使用框架配置来为任务池注入服务
		AppContext.getInstance().injectTaskThreadPoolExecutor(executor);
	}
	
	/**
	 * 屏蔽其他的提交方法，单独提供面向任务的提交方法，这是该门面类的主要方法
	 * @param task
	 * @return
	 */
	public Future<ITaskResult> submit(ITask task) {
		if (task == null) throw new NullPointerException();
		// 使用框架配置来为任务池注入服务
		AppContext.getInstance().injectTask(task);
		// 添加到执行列表
		RunnableFuture<ITaskResult> ftask = new FutureTask(task);
		executor.execute(ftask);
		return ftask;
	}
	
	@Override
	public void accept(IVisitor visitor) {
		visitor.visit(this);
	}

	@Override
	public List<ITask> getCurrentTasks() {
		return executor.getCurrentTasks();
	}

	@Override
	public List<ITask> getCompleteTasks() {
		return executor.getCompleteTasks();
	}

	@Override
	public List<ITask> getErrorTasks() {
		return executor.getErrorTasks();
	}
	
	@Override
	public List<ITask> getCancelTasks() {
		return executor.getCancelTasks();
	}

	@Override
	public void addTaskPoolEventListener(ITaskPoolEventListener listener) {
		executor.addTaskPoolEventListener(listener);
	}
	
	public void shutdown(){
		executor.shutdown();
	}
	
	/**
	 * @Description: 自定义的FutureTask，扩展原JDK的实现
	 * @author meepai
	 * @date 2016-11-21
	 */
	public static class FutureTask extends java.util.concurrent.FutureTask<ITaskResult> {
		
		private ITask task;
		
		public FutureTask(ITask task) {
			super(task);
			this.task = task;
		}

		public ITask getTask() {
			return task;
		}

		public void setTask(ITask task) {
			this.task = task;
		}
	}
}
